﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Resources;
using Cesave.Domain.Core;
using System.Data;

namespace Cesave.Domain.PermisosModule.Contracts.Financiamientos
{
	public class FinanciamientoService
		: IFinanciamientoService
	{

		#region Private properties

		/// <summary>
		/// 
		/// </summary>
		private IFinanciamientoRepository _financiamientoRepository;

		#endregion

		#region Constructor

		/// <summary>
		/// 
		/// </summary>
		/// <param name="financiamientoRepository"></param>
		public FinanciamientoService(IFinanciamientoRepository financiamientoRepository)
		{
			if (financiamientoRepository == null)
				throw new ArgumentNullException(Messages.exception_DependenciesAreNotInitialized, "financiamientoRepository");
			_financiamientoRepository = financiamientoRepository;
		}

		#endregion

		#region IFinanciamientoService Members

		/// <summary>
		/// 
		/// </summary>
		/// <param name="financiamiento"></param>
		public void AddFinanciamiento(Entities.Financiamiento financiamiento)
		{
			if (financiamiento == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "financiamiento");
			IUnitOfWork unitOfWork = _financiamientoRepository.StoreContext;
			_financiamientoRepository.Add(financiamiento);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="financiamiento"></param>
		public void ChangeFinanciamiento(Entities.Financiamiento financiamiento)
		{
			if (financiamiento == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "financiamiento");
			IUnitOfWork unitOfWork = _financiamientoRepository.StoreContext;
			_financiamientoRepository.Modify(financiamiento);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="juntaGuid"></param>
		/// <returns></returns>
		public List<Entities.Financiamiento> FindFinanciamientosByJunta(Guid juntaGuid)
		{
			if (juntaGuid == Guid.Empty)
				throw new ArgumentException(Messages.exception_InvalidArgument, "juntaGuid");
			return _financiamientoRepository.FindFinanciamientosByJunta(new FinanciamientosByJuntaSpecification(juntaGuid)).ToList();
		}

		public List<Entities.Financiamiento> FindFinanciamientosByJuntaAndStatus(Guid juntaGuid, bool status = true)
		{
			if (juntaGuid == Guid.Empty)
				throw new ArgumentException(Messages.exception_InvalidArgument, "juntaGuid");
			return _financiamientoRepository.FindFinanciamientosByJuntaAndStatus(
				new FinanciamientosByJuntaSpecification(juntaGuid),
				new FinanciamientosByStatusSpecification(status)
			).ToList();
		}

		#endregion

		#region IDisposable Members

		public void Dispose()
		{
			if (_financiamientoRepository != null && _financiamientoRepository.StoreContext != null)
				_financiamientoRepository.StoreContext.Dispose();
		}

		#endregion
	}
}
